import http from '@/utils/request'
import { getLocalChannels, hasToken, setLocalChannels } from '@/utils/storage'

import store, { Appdispatch } from '..'
import { ListType } from '../reducer/channel'

/**
 * @param // 获取用户的频道列表 // Path： /v1_0/user/channels// Method： GET
 */
export function getUserChannelList() {
  return async (dispatch: Appdispatch) => {
    //情况1: 如果有token，证明用户已经登录，获取用户自己本身的频道
    if (hasToken()) {
      const res = await http.get(`/v1_0/user/channels`)

      dispatch({ type: 'channel/saveChannelList', payload: res.data.channels })
    } else {
      // 情况2：用户没有token，也就是没有登录，从本地存储中获取token
      const localList = getLocalChannels()
      // 如果本地有存储，就从本地获取
      if (localList.length) {
        dispatch({ type: 'channel/saveChannelList', payload: localList })
      } else {
        // 如果本地没有存储，重新发送请求获取
        const res = await http.get(`/v1_0/user/channels`)
        // 存储到本地
        dispatch({ type: 'channel/saveChannelList', payload: res.data.channels })
        setLocalChannels(res.data.channels)
      }
    }
  }
}

/**
 * @param // 获取所有的频道列表 // Path： /v1_0/user/channels// Method： GET
 */
export function getAllChannelList() {
  return async (dispatch: Appdispatch) => {
    const res = await http.get('/v1_0/channels')
    dispatch({ type: 'channel/saveAllChannelList', payload: res.data.channels })
  }
}

/**
 * @param // 设置用户的频道（部分覆盖）
 */
export function addMyChannels(item: ListType) {
  const { list } = store.getState().channel
  const channels = [...list, item]
  return async (dispatch: Appdispatch) => {
    // 如果有token
    if (hasToken()) {
      // 发起请求
      await http.patch('/v1_0/user/channels', { channels: channels })
    } else {
      // 设置本地存储
      setLocalChannels(channels)
    }
    // 如果没有token
    dispatch({ type: 'channel/saveChannelList', payload: channels })
  }
}

/**
 * @param // 删除用户的频道
 */
export function deleteMyChannels(id: number) {
  const { list } = store.getState().channel
  const delChannel = list.filter((v) => v.id !== id)
  return async (dispatch: Appdispatch) => {
    // 如果有token 发送请求
    if (hasToken()) {
      await http.delete(`/v1_0/user/channels/${id}`)
    } else {
      // 如果没有token，设置本地存储
      setLocalChannels(delChannel)
    }
    // 更新状态，用于更新浏览器的界面
    dispatch({ type: 'channel/saveChannelList', payload: delChannel })
  }
}
